home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
turbovis
/
tvtoyc01.zip
/
HELP.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-07
|
10KB
|
357 lines
/*------------------------------------------------------------*/
/* filename - Help.cpp */
/* */
/* function(s) */
/* Member function(s) of following classes */
/* THelpViewer */
/* THelpWindow */
/*------------------------------------------------------------*/
/*------------------------------------------------------------*/
/* */
/* Turbo Vision - Version 1.0 */
/* */
/* */
/* Copyright (c) 1991 by Borland International */
/* All Rights Reserved. */
/* */
/*------------------------------------------------------------*/
#define Uses_TStreamableClass
#define Uses_TPoint
#define Uses_TStreamable
#define Uses_ipstream
#define Uses_opstream
#define Uses_fpstream
#define Uses_TRect
#define Uses_TScrollBar
#define Uses_TScroller
#define Uses_TDrawBuffer
#define Uses_TEvent
#define Uses_TWindow
#define Uses_TKeys
#define Uses_TPalette
#include <tv.h>
#if !defined( __HELP_H )
#include "Help.h"
#endif // __HELP_H
#if !defined( __UTIL_H )
#include "Util.h"
#endif // __UTIL_H
#if !defined( __STRING_H )
#include <string.h>
#endif // __STRING_H
#if !defined( __LIMITS_H )
#include <limits.h>
#endif // __LIMITS_H
#if !defined( __STAT_H )
#include <sys\stat.h>
#endif // __STAT_H
#if !defined( __CTYPE_H )
#include <ctype.h>
#endif // __CTYPE_H
#if !defined( __IO_H )
#include <io.h>
#endif // __IO_H
#pragma warn -dsz
// THelpViewer
#ifdef HELPEXTENSIONS
int THelpViewer::oldSelected[THelpFile::maxOldTopics+1];
#endif
THelpViewer::THelpViewer( const TRect& bounds, TScrollBar* aHScrollBar,
TScrollBar* aVScrollBar, THelpFile *aHelpFile, ushort context )
: TScroller( bounds, aHScrollBar, aVScrollBar )
{
options = (options | ofSelectable);
growMode = gfGrowHiX | gfGrowHiY;
hFile = aHelpFile;
topic = aHelpFile->getTopic(context);
topic->setWidth(size.x);
setLimit(78, topic->numLines());
selected = 1;
}
THelpViewer::~THelpViewer()
{
delete hFile;
delete topic;
}
void THelpViewer::changeBounds( const TRect& bounds ) // fix Help-3
{
TScroller::changeBounds(bounds);
topic->setWidth(size.x);
setLimit(limit.x, topic->numLines());
}
void THelpViewer::draw()
{
TDrawBuffer b;
char line[256];
char buffer[256];
char *bufPtr;
int i, j, l;
int keyCount;
ushort normal, keyword, selKeyword, c;
TPoint keyPoint;
uchar keyLength;
int keyRef;
normal = getColor(1);
keyword = getColor(2);
selKeyword = getColor(3);
keyCount = 0;
keyPoint.x = 0;
keyPoint.y = 0;
topic->setWidth(size.x);
if (topic->getNumCrossRefs() > 0)
{
do
{ // fix Help-2
topic->getCrossRef(keyCount, keyPoint, keyLength, keyRef);
++keyCount;
} while ( (keyCount < topic->getNumCrossRefs()) && (keyPoint.y <= delta.y));
/************************************
{
++keyCount;
topic->getCrossRef(keyCount-1, keyPoint, keyLength, keyRef);
} while ( (keyCount <= topic->getNumCrossRefs()) && (keyPoint.y < delta.y));
*************************************/
}
for (i = 1; i <= size.y; ++i)
{
b.moveChar(0, ' ', normal, size.x);
strcpy(line, topic->getLine(i + delta.y));
if (strlen(line) > delta.x)
{
bufPtr = line + delta.x;
strncpy(buffer, bufPtr, size.x);
buffer[size.x] = 0;
b.moveStr(0, buffer, normal);
}
else
b.moveStr(0, "", normal);
while (i + delta.y == keyPoint.y)
{
l = keyLength;
if (keyPoint.x < delta.x )
{
l -= (delta.x - keyPoint.x);
keyPoint.x = delta.x;
}
if (keyCount == selected)
c = selKeyword;
else
c = keyword;
for(j = 0; j < l; ++j)
b.putAttribute((keyPoint.x - delta.x + j),c);
/***********************************************
++keyCount;
if (keyCount <= topic->getNumCrossRefs())
topic->getCrossRef(keyCount-1, keyPoint, keyLength, keyRef);
else
************************************************/
if ( keyCount < topic->getNumCrossRefs() ) // fix Help-2
{
topic->getCrossRef(keyCount, keyPoint, keyLength, keyRef);
++keyCount;
}
else
keyPoint.y = 0;
}
writeLine(0, i-1, size.x, 1, b);
}
}
TPalette& THelpViewer::getPalette() const
{
static TPalette palette(cHelpViewer, sizeof( cHelpViewer)-1);
return palette;
}
void THelpViewer::makeSelectVisible( int selected, TPoint& keyPoint,
uchar& keyLength, int& keyRef )
{
TPoint d;
topic->getCrossRef(selected, keyPoint, keyLength, keyRef);
d = delta;
if (keyPoint.x < d.x)
d.x = keyPoint.x;
if (keyPoint.x > d.x + size.x)
d.x = keyPoint.x - size.x;
if (keyPoint.y < d.y)
d.y = keyPoint.y - 1; // fix Help-2
if (keyPoint.y > d.y + size.y)
d.y = keyPoint.y - size.y;
if ((d.x != delta.x) || (d.y != delta.y))
scrollTo(d.x, d.y);
}
void THelpViewer::switchToTopic( int keyRef )
{
#ifdef HELPEXTENSIONS
if (hFile->helpAlreadyPopped)
oldSelected[THelpFile::oldCount] = selected;
if (owner!=0)
owner->lock();
#endif
if (topic != 0)
delete topic;
topic = hFile->getTopic(keyRef);
topic->setWidth(size.x);
scrollTo(0, 0);
setLimit(limit.x, topic->numLines());
selected = 1;
#ifdef HELPEXTENSIONS
if ((keyRef == previousTopic) && (oldSelected[THelpFile::oldCount]!=0))
{
selected = oldSelected[THelpFile::oldCount];
drawView();
if (selected <= topic->getNumCrossRefs())
{
TPoint keyPoint;
uchar keyLength;
makeSelectVisible(selected-1,keyPoint,keyLength,keyRef);
}
}
else
drawView();
if (owner!=0)
owner->unlock();
#else
drawView();
#endif
}
void THelpViewer::handleEvent( TEvent& event )
{
TPoint keyPoint, mouse;
uchar keyLength;
int keyRef;
int keyCount;
TScroller::handleEvent(event);
switch (event.what)
{
case evKeyDown:
switch (event.keyDown.keyCode)
{
case kbTab:
++selected;
if (selected > topic->getNumCrossRefs())
selected = 1;
if ( topic->getNumCrossRefs() != 0 )
makeSelectVisible(selected-1,keyPoint,keyLength,keyRef);
break;
case kbShiftTab:
--selected;
if (selected == 0)
selected = topic->getNumCrossRefs();
if ( topic->getNumCrossRefs() != 0 )
makeSelectVisible(selected-1,keyPoint,keyLength,keyRef);
break;
case kbEnter:
if (selected <= topic->getNumCrossRefs())
{
topic->getCrossRef(selected-1, keyPoint, keyLength, keyRef);
switchToTopic(keyRef);
}